/**
* Router类，封装uni自带的跳转方法.
* @overview
    //外部给beforeEach赋值，如果不是函数set会报错
    //然后调用实例方法的时候，给回调函数传参
* @example
    //调用this.$mRouter.push({path:xx,params:xx})就是把{path:xx,params:xx}传给to
*/
class Router {
	constructor(options = {}) {
		this.options = options // 存储路由映射表
		this.prevPage = '' //上个页面的路由名称

		return new Proxy(this, {
			get(target, key) {
				if (key === 'back') {
					return target[key]
				}
				if (key === 'prevPage') {
					return target['getPrevPage']()
				}
				return (...args) => {
					if (key === 'push') {
						key = 'navigateTo'
					}
					target.beforeEach(key, ...args)
				}
			},
			set(target, key, value) {
				if (value instanceof Function) {
					target[key] = value
					return true
				} else {
					throw new TypeError('beforeEach must a function')
				}
			}
		})
	}

	// back和以上区分是因为，back不需要地址和参数只需要传入回退几层即可
	back(params) {
		if (params) {
			if(params.page){
				let pages = getCurrentPages()
				let index=utils.findLastIndex(pages,'route',params.page)
				uni.navigateBack({
					delta:pages.length-1-index
				})
			}else{
				uni.navigateBack({
					...params
				})
			}
		} else {
			uni.navigateBack({
				delta: 1
			})
		}
	}

	// 前置路由守卫
	beforeEach() {

	}

	//获取上一页路由信息
	getPrevPage() {
		let pages = getCurrentPages()
		if (pages.length > 1) {
			let prevRoute = pages[pages.length - 2].route
			return prevRoute
		} else {
			return ""
		}
	}
}

export default Router
